package com.zenithmind.chat.enums;

import com.baomidou.mybatisplus.annotation.EnumValue;
import com.fasterxml.jackson.annotation.JsonValue;
import lombok.Getter;

/**
 * 消息类型枚举 - 遵循开闭原则
 * 
 * @author ZenithMind Team
 * @since 2025-01-09
 */
@Getter
public enum MessageType {
    
    /**
     * 文本消息
     */
    TEXT(1, "文本", "text"),
    
    /**
     * 图片消息
     */
    IMAGE(2, "图片", "image"),
    
    /**
     * 文件消息
     */
    FILE(3, "文件", "file"),
    
    /**
     * 语音消息
     */
    VOICE(4, "语音", "voice"),
    
    /**
     * 视频消息
     */
    VIDEO(5, "视频", "video"),
    
    /**
     * 系统消息
     */
    SYSTEM(6, "系统消息", "system"),
    
    /**
     * 表情消息
     */
    EMOJI(7, "表情", "emoji"),
    
    /**
     * 链接消息
     */
    LINK(8, "链接", "link"),
    
    /**
     * 位置消息
     */
    LOCATION(9, "位置", "location"),
    
    /**
     * 名片消息
     */
    CONTACT(10, "名片", "contact");

    /**
     * 类型码 - 用于数据库存储
     */
    @EnumValue
    @JsonValue
    private final Integer code;

    /**
     * 类型名称
     */
    private final String name;

    /**
     * 类型标识
     */
    private final String identifier;

    /**
     * 构造函数
     */
    MessageType(Integer code, String name, String identifier) {
        this.code = code;
        this.name = name;
        this.identifier = identifier;
    }

    /**
     * 根据类型码获取枚举
     * 
     * @param code 类型码
     * @return 对应的枚举值
     */
    public static MessageType fromCode(Integer code) {
        if (code == null) {
            return TEXT;
        }
        
        for (MessageType type : values()) {
            if (type.getCode().equals(code)) {
                return type;
            }
        }
        
        throw new IllegalArgumentException("未知的消息类型码: " + code);
    }

    /**
     * 根据标识获取枚举
     * 
     * @param identifier 类型标识
     * @return 对应的枚举值
     */
    public static MessageType fromIdentifier(String identifier) {
        if (identifier == null || identifier.trim().isEmpty()) {
            return TEXT;
        }
        
        for (MessageType type : values()) {
            if (type.getIdentifier().equals(identifier)) {
                return type;
            }
        }
        
        return TEXT;
    }

    /**
     * 检查是否为媒体类型
     * 
     * @return 是否为媒体类型
     */
    public boolean isMediaType() {
        return this == IMAGE || this == FILE || this == VOICE || this == VIDEO;
    }

    /**
     * 检查是否为系统消息
     * 
     * @return 是否为系统消息
     */
    public boolean isSystemMessage() {
        return this == SYSTEM;
    }

    /**
     * 检查是否需要存储媒体文件
     * 
     * @return 是否需要存储媒体文件
     */
    public boolean requiresMediaStorage() {
        return this == IMAGE || this == FILE || this == VOICE || this == VIDEO;
    }
}
